package gui.addrecipe;
import image.ImgManipulator;

import javax.imageio.ImageIO;
import javax.swing.JPanel;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.Image;
import java.awt.Insets;
import javax.swing.JLabel;
import java.awt.Color;
import javax.swing.border.LineBorder;
import javax.swing.filechooser.FileFilter;

import java.awt.Dimension;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;

import start.Start;

import java.io.File;
import java.io.IOException;

/**
 * Unterpanel von AddRecipe.java.
 * Bietet weitere Moeglichkeiten wie Bildupload, Bewertung, usw. an
 * @author Dominik Korittki
 */
public class AddRecipeRightBottomPanel extends JPanel {
	
	/** Button zum Auswaehlen einer Bilddatei */
	private JButton btnBildHinzufgen;
	
	/** Button zum Loeschen des ausgewaehlten Bildes */
	private JButton btnBildLschen;
	
	/** Festlegen fuer wieviele Personen das Rezept ausgelegt ist */
	private JSpinner spinner;
	
	/** Textarea fuer die Tags */
	private JTextArea txtArea;
	
	/** Filechooser zur Auswahl der Bilddatei */
	private final JFileChooser filechooser;
	
	/** Label zur Anzeige des Vorschau Bildes */
	private JLabel previewImg;
	
	/** Constrains fuer Positionsinfos des previewImg Labels */
	private GridBagConstraints gbc_previewImg;
	
	/** Panel des Sternbewertungssystems */
	private Stars stars;
	
	/** Enthaelt zwischengespeicherte Bilder des Vorschaubildes, welche spaeter abgespeichert werden */
	private ImgManipulator img = null;
	
	/** Falls ein Bild geloescht wird, wird dies true */
	private boolean imgChanged = false;
	
	/** Bewertung des Gerichts */
	private int bewertung = 0;

	/** Serial Version ID */
	private static final long serialVersionUID = 1L;

	/**
	 * Panel erstellen
	 */
	public AddRecipeRightBottomPanel() {
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[]{0, 0, 0};
		gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 5, 30, 0};
		gridBagLayout.columnWeights = new double[]{0.0, 0.0, Double.MIN_VALUE};
		gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 1.0, 0.0, 2.0, Double.MIN_VALUE};
		setLayout(gridBagLayout);
		
		filechooser = new JFileChooser();
		filechooser.setFileFilter(new FileFilter() {
			
			/*
			 * Name des Dateifilters
			 */
			@Override
			public String getDescription() {
				return "JPEG Bild";
			}
			
			/*
			 * Nur JPEG Dateien zulassen
			 */
			@Override
			public boolean accept(File f) {
				return f.getName().toLowerCase().endsWith(".jpg") || 
					   f.getName().toLowerCase().endsWith(".jpeg") || 
					   f.isDirectory();
			}
		});
		filechooser.setAcceptAllFileFilterUsed(false);
		
		btnBildHinzufgen = new JButton("Bild hinzufügen", new ImageIcon(Start.getImgs().getLoadFolderSmall()));
		btnBildHinzufgen.addActionListener(new ActionListener() {
			@Override public void actionPerformed(ActionEvent arg0) {
				//Handle open button action.
			    int returnVal = filechooser.showOpenDialog(AddRecipeRightBottomPanel.this);

		        if (returnVal == JFileChooser.APPROVE_OPTION) {
		            File file = filechooser.getSelectedFile();
		        	
		            //Datei geoeffnet
		            try {
		            	Image tempImg = ImageIO.read(file);
						ImgManipulator newImg = new ImgManipulator(tempImg);
						changePreviewImage(newImg);
					} catch(IOException e) {
						System.out.println("Eventuell keine Bilddatei geoeffnet?");
						e.printStackTrace();
					}
		            
		            System.out.println("Bilddatei oeffnen");
		        } else {
		            System.out.println("Open command cancelled by user.");
		        }
			}
		});
		btnBildHinzufgen.addKeyListener(new KeyListener() {
			@Override public void keyPressed(KeyEvent arg0) {
				int returnVal = filechooser.showOpenDialog(AddRecipeRightBottomPanel.this);
				if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
			        if (returnVal == JFileChooser.APPROVE_OPTION) {
			            File file = filechooser.getSelectedFile();
			        	
			            //Datei geoeffnet
			            try {
			            	Image tempImg = ImageIO.read(file);
							ImgManipulator newImg = new ImgManipulator(tempImg);
							changePreviewImage(newImg);
						} catch(IOException e) {
							System.out.println("Eventuell keine Bilddatei geoeffnet?");
							e.printStackTrace();
						}
			            
			            System.out.println("Bilddatei oeffnen");
			        } else {
			            System.out.println("Open command cancelled by user.");
			        }
				}
			}
			@Override public void keyReleased(KeyEvent arg0) {}
			@Override public void keyTyped(KeyEvent arg0) {}
		});
		
		GridBagConstraints gbc_btnBildHinzufgen = new GridBagConstraints();
		gbc_btnBildHinzufgen.fill = GridBagConstraints.HORIZONTAL;
		gbc_btnBildHinzufgen.insets = new Insets(10, 5, 5, 5);
		gbc_btnBildHinzufgen.gridx = 0;
		gbc_btnBildHinzufgen.gridy = 0;
		add(btnBildHinzufgen, gbc_btnBildHinzufgen);
		
		previewImg = new JLabel(new ImageIcon(Start.getImgs().getKeinBild()));
		previewImg.setAlignmentX(Component.CENTER_ALIGNMENT);
		previewImg.setBorder(new LineBorder(new Color(0, 0, 0)));
		gbc_previewImg = new GridBagConstraints();
		gbc_previewImg.gridheight = 3;
		gbc_previewImg.insets = new Insets(10, 0, 5, 0);
		gbc_previewImg.gridx = 1;
		gbc_previewImg.gridy = 0;
		add(previewImg, gbc_previewImg);
		
		btnBildLschen = new JButton("Bild löschen", new ImageIcon(Start.getImgs().getMinusSmall()));
		GridBagConstraints gbc_btnBildLschen = new GridBagConstraints();
		gbc_btnBildLschen.insets = new Insets(0, 5, 5, 5);
		gbc_btnBildLschen.fill = GridBagConstraints.HORIZONTAL;
		gbc_btnBildLschen.gridx = 0;
		gbc_btnBildLschen.gridy = 1;
		add(btnBildLschen, gbc_btnBildLschen);
		
		btnBildLschen.addActionListener(new ActionListener() {
			/*
			 * Loescht das aktuell gesetze Vorschaubild
			 */
			@Override public void actionPerformed(ActionEvent arg0) {
				removePreviewImage();
			}
		});
		btnBildLschen.addKeyListener(new KeyListener() {
			@Override public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_ENTER) 
					removePreviewImage();
			}
			@Override public void keyReleased(KeyEvent e) {}
			@Override public void keyTyped(KeyEvent e) {}
		});
		
		JLabel lblBewertung = new JLabel("Bewertung:");
		GridBagConstraints gbc_lblBewertung = new GridBagConstraints();
		gbc_lblBewertung.anchor = GridBagConstraints.SOUTHEAST;
		gbc_lblBewertung.insets = new Insets(0, 0, 10, 5);
		gbc_lblBewertung.gridx = 0;
		gbc_lblBewertung.gridy = 3;
		add(lblBewertung, gbc_lblBewertung);
		
		stars = new Stars();
		GridBagConstraints gbc_stars = new GridBagConstraints();
		gbc_stars.anchor = GridBagConstraints.SOUTH;
		gbc_stars.insets = new Insets(0, 0, 5, 0);
		gbc_stars.gridx = 1;
		gbc_stars.gridy = 3;
		add(stars, gbc_stars);
		
		JLabel lblAnzahlPersonen = new JLabel("Personenzahl:");
		GridBagConstraints gbc_lblAnzahlPersonen = new GridBagConstraints();
		gbc_lblAnzahlPersonen.anchor = GridBagConstraints.EAST;
		gbc_lblAnzahlPersonen.insets = new Insets(0, 0, 5, 5);
		gbc_lblAnzahlPersonen.gridx = 0;
		gbc_lblAnzahlPersonen.gridy = 4;
		add(lblAnzahlPersonen, gbc_lblAnzahlPersonen);
		
		SpinnerModel spinnerModel = new SpinnerNumberModel(1, 1, 30, 1);
		spinner = new JSpinner(spinnerModel);
		spinner.setValue(1);
		spinner.setPreferredSize(new Dimension(50, 18));
		GridBagConstraints gbc_spinner = new GridBagConstraints();
		gbc_spinner.anchor = GridBagConstraints.WEST;
		gbc_spinner.insets = new Insets(0, 0, 5, 0);
		gbc_spinner.gridx = 1;
		gbc_spinner.gridy = 4;
		add(spinner, gbc_spinner);
		
		JLabel lblTags = new JLabel("Tags:");
		GridBagConstraints gbc_lblTags = new GridBagConstraints();
		gbc_lblTags.anchor = GridBagConstraints.NORTHEAST;
		gbc_lblTags.insets = new Insets(0, 0, 0, 5);
		gbc_lblTags.gridx = 0;
		gbc_lblTags.gridy = 5;
		add(lblTags, gbc_lblTags);
		
		txtArea = new JTextArea();
		txtArea.setToolTipText("Tags helfen beim Suchen von Rezepten. Einträge mit Komma separieren. \r\nBeispiel: köstlich, Banane, Tomate, ...");
		txtArea.setFont(new Font("Verdana", Font.PLAIN, 11));
		txtArea.setLineWrap(true);
		txtArea.setWrapStyleWord(true);
		
		JScrollPane scrollPane = new JScrollPane(txtArea);
		GridBagConstraints gbc_scrollPane = new GridBagConstraints();
		gbc_scrollPane.fill = GridBagConstraints.BOTH;
		gbc_scrollPane.gridx = 1;
		gbc_scrollPane.gridy = 5;
		add(scrollPane, gbc_scrollPane);
	}
	
	/**
	 * Setzt das aktuelle Bild fuer das Rezept
	 * @param newImg ersetzendes Bild
	 */
	public void changePreviewImage(ImgManipulator newImg) {
		remove(previewImg);
		revalidate();
		repaint();
		previewImg = new JLabel(new ImageIcon(newImg.getThumbAsImage()));
		previewImg.setAlignmentX(Component.CENTER_ALIGNMENT);
		previewImg.setBorder(new LineBorder(new Color(0, 0, 0)));
		add(previewImg, gbc_previewImg);
		img = newImg;
	}
	
	/**
	 * Setzt das PreviewBild ohne es spaeter beim Speichern zu beruecksichtigen
	 * @param file neues Vorschaubild
	 */
	public void changePreviewImageOnly(Image file) {
		remove(previewImg);
		revalidate();
		repaint();
		previewImg = new JLabel(new ImageIcon(file));
		previewImg.setAlignmentX(Component.CENTER_ALIGNMENT);
		previewImg.setBorder(new LineBorder(new Color(0, 0, 0)));
		add(previewImg, gbc_previewImg);
	}
	
	/**
	 * Setzt das aktuelle Vorschaubild wieder zurueck
	 */
	public void removePreviewImage() {
		imgChanged = true;
		remove(previewImg);
		revalidate();
		repaint();
		previewImg = new JLabel(new ImageIcon(Start.getImgs().getKeinBild()));
		previewImg.setAlignmentX(Component.CENTER_ALIGNMENT);
		previewImg.setBorder(new LineBorder(new Color(0, 0, 0)));
		add(previewImg, gbc_previewImg);
		img = null;
	}
	
	/**
	 * Getter fuer die Bewertung
	 * @return Bewertung
	 */
	public int getBewertung() {
		return bewertung;
	}
	
	/**
	 * Setter fuer die Bewertung
	 * @param bewertung
	 */
	public void setBewertung(int bewertung) {
		this.bewertung = bewertung;
	}
	
	/**
	 * Getter fuer die Anzahl der Personen, fuer die das Gericht ausgelegt ist
	 * @return Anzahl der Personen
	 */
	public int getAnzahlPersonen() {
		return (Integer) spinner.getValue();
	}
	
	/**
	 * Getter fuer die Tags
	 * @return	TextArea fuer Tags
	 */
	public String getTags() {
		return txtArea.getText();
	}

	/**
	 * Getter fuer das zwischengespeicherte Bild
	 * @return Zwischengespeichertes Bild
	 */
	public ImgManipulator getImg() {
		return img;
	}

	/**
	 * Setter fuer das zwischengespeicherte Bild
	 * @param img Zwischengespeichertes Bild
	 */
	public void setImg(ImgManipulator img) {
		this.img = img;
	}

	/**
	 * Getter fuer das Label, welches das Vorschaubild enthaelt
	 * @return Label fuer das Vorschaubild
	 */
	public JLabel getPreviewImg() {
		return previewImg;
	}

	/**
	 * Getter fuer das Label, welches das Vorschaubild enthaelt
	 * @param previewImg Label fuer das Vorschaubild
	 */
	public void setPreviewImg(JLabel previewImg) {
		this.previewImg = previewImg;
	}
	
	/**
	 * Getter fuer Spinner fuer Anzahl Personen
	 * @return Spinner fuer Anzahl Personen
	 */
	public JSpinner getSpinner() {
		return spinner;
	}

	/**
	 * Getter fuer die Textarea der Tags
	 * @return Textarea der Tags
	 */
	public JTextArea getTxtArea() {
		return txtArea;
	}

	/**
	 * Getter fuer das Sternsystem
	 * @return Sternpanel
	 */
	public Stars getStars() {
		return stars;
	}
	
	/**
	 * Getter fuer die Variable, die wahrnimmt wenn ein Bild geloscht wurde
	 * @return Variable, die wahrnimmt wenn ein Bild geloscht wurde
	 */
	public boolean getImgChanged() {
		return imgChanged;
	}

	/**
	 * Zuruecksetzen der Informationen, zuruecksetzen des Bildes
	 */
	public void reset() {
		removePreviewImage();
		stars.reset();
		spinner.setValue(1);
		txtArea.setText("");
		bewertung = 0;
	}
	
}
